package com.order.manager.controller.Evaluate;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.order.manager.Model.EvaluateInfo;
import com.order.manager.Model.OrderInfo;
import com.order.manager.Model.ShopInfo;
import com.order.manager.Model.other.RestBean;
import com.order.manager.service.impl.EvaluateInfoServiceImpl;
import com.order.manager.service.impl.OrderInfoServiceImpl;
import com.order.manager.service.impl.ShopInfoServiceImpl;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.UUID;

/**
 * 评价管理控制器
 * 处理用户对订单的评价操作，包括创建评价、查询评价等功能
 */
@RestController
@RequestMapping("/api/evaluate")
public class EvaluateController {
    @Resource
    EvaluateInfoServiceImpl evaluateInfoService;
    @Resource
    ShopInfoServiceImpl shopInfoService;
    @Resource
    OrderInfoServiceImpl orderInfoService;
    @RequestMapping("/create")
    public RestBean createEvaluate(@RequestBody EvaluateInfo evaluateInfo) {
        // 检查订单是否已被评价
        if (evaluateInfoService.getOne(new QueryWrapper<EvaluateInfo>()
                .eq("order_id", evaluateInfo.getOrderId())
        ) != null) {
            // 已评价则返回403错误
            return RestBean.failure(403, "该订单已评论，请勿重复评论");
        }
        // 生成唯一评价ID
        String uuid = UUID.randomUUID().toString();
        evaluateInfo.setEvaluateId(uuid);
        // 设置评价创建时间
        evaluateInfo.setInputTime(new Date());
        // 初始更新时间设为null
        evaluateInfo.setUpdateTime(null);
        // 获取订单信息并更新订单状态为"已评价"
        OrderInfo orderInfo = orderInfoService.getById(evaluateInfo.getOrderId());
        orderInfo.setApplyState(2); // 2表示已评价状态
        orderInfo.setUpdateTime(new Date());
        orderInfoService.updateById(orderInfo);

        // 保存评价信息到数据库
        return evaluateInfoService.save(evaluateInfo)
                ? RestBean.success(evaluateInfo)
                : RestBean.failure(500, "评价失败");
    }

    /**
     * 根据订单ID查询评价
     * @param orderId 订单ID，通过路径变量传递
     * @return 操作结果：成功返回评价信息，失败返回错误信息
     */
    @RequestMapping("/select/{orderId}")
    public RestBean select(@PathVariable String orderId) {
        // 查询订单对应的评价信息
        EvaluateInfo evaluateInfo = evaluateInfoService.getOne(new QueryWrapper<EvaluateInfo>()
                .eq("order_id", orderId)
        );

        // 判断是否存在评价信息并返回对应结果
        return evaluateInfo == null
                ? RestBean.failure(403, "没有该订单信息")
                : RestBean.success(evaluateInfo);
    }

    /**
     * 根据店铺ID查询该店铺的所有评价
     * @param shopId 店铺ID，通过路径变量传递
     * @return 操作结果：成功返回评价列表，失败返回错误信息
     */
    @RequestMapping("/select/shopId/{shopId}")
    public RestBean getByShopId(@PathVariable String shopId) {
        // 调用服务层方法查询店铺评价列表
        return RestBean.success(evaluateInfoService.queryByShopId(shopId));
    }
}